home *** CD-ROM | disk | FTP | other *** search
- /*======================================
- * LCON用 EXPファイル実行ドライバ
- *
- * 1993 by マシーンM
- *======================================
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <process.h>
- #include <dos.h>
- #include <sys\stat.h>
-
- #define VERSION "0.04"
-
- #define ENV_EXP "PATHEXP" // EXPファイル格納位置 環境変数
- #define EXT_EXP "exp" // EXPファイルの拡張子
-
- int flag_initt = 0; // 実行後テキスト画面 0:初期化しない 1:初期化する
- int flag_initg = 0; // 実行後グラフィック画面 0:初期化しない 1:初期化する
- int flag_nocrt = 0; // nocrtresetフラグ 0:付けない 1:付ける
- int flag_exec = 1; // 実行フラグ 0:実行しない 1:実行する
- int flag_text = 1; // テキスト表示フラグ 0:表示しない 1:表示する
-
-
- void
- call_int91(int ax)
- {
- union REGS inregs, outregs;
-
- inregs.x.ax = ax;
- int86(0x91, &inregs, &outregs);
- }
-
-
- /*----------------------------------------------------
- * ファイルが存在するかの確認
- *----------------------------------------------------
- * in name - ファイル名
- * out <ret> - 1:存在する
- * 0:存在しない
- *----------------------------------------------------
- */
- int
- is_exist(char *name)
- {
- struct stat buf;
-
- return stat(name, &buf) ? 0 : 1;
- }
-
-
- /*----------------------------------------------------
- * 環境変数に設定されているパスを順番に取り出す
- * (初期化)
- *----------------------------------------------------
- * in env - 取り出す環境変数名
- *----------------------------------------------------
- */
- char path_buf[256];
- char *path_ptr;
-
- void
- init_path(char *env)
- {
- char *p;
-
- p = getenv(env);
- if ( p == (char*)0 ) {
- path_buf[0] = 0;
- } else {
- strcpy(path_buf, p);
- }
- path_ptr = strtok(path_buf, ";");
- }
-
-
- /*----------------------------------------------------
- * 環境変数に設定されているパスを順番に取り出す
- * パスの最後は必ず "\" になっている
- *----------------------------------------------------
- * out <ret> - !0:パス名
- * 0:おわり
- *----------------------------------------------------
- */
- char *
- get_path(void)
- {
- static char buf[256];
- int c;
-
- if ( path_ptr == 0 ) return 0;
-
- strcpy(buf, path_ptr);
- c = strlen(buf);
- if ( c > 0 && buf[c-1]!='\\' && buf[c-1]!=':' ) {
- strcat(buf, "\\");
- }
- path_ptr = strtok(NULL, ";");
-
- return buf;
- }
-
-
- /*-------------------------------------------------
- * 指定ファイル名の拡張子を再設定する
- *-------------------------------------------------
- * in name - ファイル名
- * ext - 拡張子(ピリオドはいらない)
- * 例. "EXP"
- *-------------------------------------------------
- */
- void
- extcat(char *name, char *ext)
- {
- char *pp, *nmp;
-
- if ( (nmp=strrchr(name, '\\'))==NULL ) { // ファイル名の位置設定
- nmp = name;
- }
-
- if ( (pp=strrchr(nmp, '.'))!=NULL ) { // ファイル名の"."以降を削除
- *pp = 0;
- }
- strcat(name, ".");
- strcat(name, ext);
- }
-
-
- /*-------------------------------------------
- * ファイルを検索し、フルパスを返す
- *-------------------------------------------
- */
- char *
- search_exp(char *name)
- {
- static char buf[256];
- char *path;
-
- if ( strchr(name, '\\')!=NULL || strchr(name, ':')!=NULL ) {
- strcpy(buf, name);
- extcat(buf, EXT_EXP);
- if ( is_exist(buf) ) return buf;
-
- } else {
- init_path(ENV_EXP);
- while ( (path=get_path()) != 0 ) {
- strcpy(buf, path);
- strcat(buf, name);
- extcat(buf, EXT_EXP);
- if ( is_exist(buf) ) return buf;
- }
- }
- return (char*)0;
- }
-
-
-
- int
- option_check(int argc, char *argv[])
- {
- int j;
-
- if ( argc < 2 ) return 1;
- if ( argv[1][0] != '-' ) return 0;
-
- for (j=1; argv[1][j]!=0; ++j) {
- switch ( toupper(argv[1][j]) ) {
- case 'G': flag_initg = 1; break;
- case 'I': flag_initt = 1; break;
- case 'N': flag_nocrt = 1; break;
- case 'P': flag_exec = 0; break;
- case 'S': flag_text = 0; break;
- default : return 1;
- }
- }
- return 0;
- }
-
-
- /*-------------------------------------------
- * ファイル名を取得する
- *-------------------------------------------
- */
- char *
- get_name(int argc, char *argv[])
- {
- static char buf[256];
- int n;
-
- n = (argv[1][0]=='-') ? 2 : 1;
- if ( n >= argc ) return (char *)0;
-
- strcpy(buf, argv[n]);
-
- return buf;
- }
-
-
- /*-------------------------------------------
- * ファイル名以降の文字を取得する
- *-------------------------------------------
- */
- char *
- get_arg(int argc, char *argv[])
- {
- static char buf[256];
- int n, i;
-
- n = (argv[1][0]=='-') ? 3 : 2;
-
- buf[0] = 0;
- for (i=n; i<argc; ++i) {
- strcat(buf, " ");
- strcat(buf, argv[i]);
- }
- return buf;
- }
-
-
-
- char *usage_strings[]={
- "===== EXPファイル実行ドライバ(LCON専用) version "VERSION" =====" ,
- " Copyright (c) 1993 マシーンM" ,
- " Usage: e [-{<option>}] <EXPファイル名> [{<引数>}]" ,
- " <option>: g - 実行後、グラフィック画面を消去する" ,
- " i - 実行後、テキスト画面を初期化する" ,
- " n - 「-nocrt」 を付ける" ,
- " p - 実行コマンド文字列を表示する(実行はしない)" ,
- " s - 実行時、テキスト表示を禁止する" ,
- 0
- };
-
- void
- show_strings(char *strings[])
- {
- int i;
-
- for (i=0; strings[i]!=0; ++i) {
- puts(strings[i]);
- }
- }
-
- void
- print_usage(void)
- {
- show_strings(usage_strings);
- exit(1);
- }
-
-
- int
- main(int argc, char *argv[])
- {
- char *name;
- char *pathname;
- char *arg;
- static char buf[256];
- int ret = 0;
-
- if ( option_check(argc, argv) == 1 ) print_usage();
-
- name = get_name(argc, argv);
- arg = get_arg(argc, argv);
- if ( name ) {
- strcpy(buf, "run386 ");
- if ( flag_nocrt ) strcat(buf, "-nocrt ");
- pathname = search_exp(name);
- if ( pathname ) {
- strcat(buf, pathname);
- if ( arg ) strcat(buf, arg);
- if ( flag_exec ) {
- if ( !flag_text ) {
- call_int91(0x3004); // TEXT OFF
- outportb(0xfda0, 0x0f); // レイア1 ON
- }
- call_int91(0x3001); // 現在の TEXT VRAM を退避
- call_int91(0x3010); // TEXT VRAM1 を選択
- ret = system(buf) ? 1 : 0;
- call_int91(0x3002); // 以前の TEXT VRAM を復帰
- } else {
- puts(buf);
- }
- } else {
- strcpy(buf, "not found : ");
- strcat(buf, name);
- puts(buf);
- ret = 1;
- }
- }
- if ( flag_initt ) {
- call_int91(0x3080); // コンソール初期化
- call_int91(0x3003); // 文字描画開始
- }
- if ( flag_initg ) {
- putchar('\x15'); // グラフィック消去
- }
- return ret;
- }